home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / S-ICE252.ZIP / IOSIM.ASM < prev    next >
Assembly Source File  |  1989-09-04  |  4KB  |  180 lines

  1. PAGE 55,132
  2. TITLE I/O SIMULATION TEST PROGRAM
  3. .286
  4.  
  5. ;
  6. ;    This is a sample user qualified breakpoint.
  7. ;
  8.  
  9. INT_NUM EQU    65H        ;THIS IS THE PSUDEO INTERRUPT NUMBER
  10.  
  11. REG_WORD STRUC
  12. REG_DI        DW    ?
  13. REG_SI        DW    ?
  14. REG_BP        DW    ?
  15. REG_SP        DW    ?
  16. REG_BX        DW    ?
  17. REG_DX        DW    ?
  18. REG_CX        DW    ?
  19. REG_AX        DW    ?
  20. REG_IP        DW    ?
  21. REG_CS        DW    ?
  22. REG_FLAGS    DW    ?
  23. REG_WORD ENDS
  24.  
  25. REG_BYTE STRUC
  26. REG_DI1     DW    ?
  27. REG_SI1     DW    ?
  28. REG_BP1     DW    ?
  29. REG_SP1     DW    ?
  30. REG_BL        DB    ?
  31. REG_BH        DB    ?
  32. REG_DL        DB    ?
  33. REG_DH        DB    ?
  34. REG_CL        DB    ?
  35. REG_CH        DB    ?
  36. REG_AL        DB    ?
  37. REG_AH        DB    ?
  38. REG_BYTE ENDS
  39.  
  40. STACK SEGMENT STACK
  41.         DW      50 DUP(0)
  42. STACK ENDS
  43.  
  44. DATA SEGMENT BYTE PUBLIC 'DATA'
  45.  
  46. NEW_VAL DW    ?
  47. NEXT_IN_LOC DW    0
  48. NEXT_OUT_LOC DW  0
  49. PUBLIC BUFFIN
  50. BUFFIN     DW    1000H    DUP(0)
  51. PUBLIC BUFFOUT
  52. BUFFOUT  DW    1000H    DUP(0)
  53. DATA ENDS
  54.  
  55. CODE SEGMENT PUBLIC 'CODE'
  56. CODE ENDS
  57.  
  58. LAST SEGMENT PUBLIC 'LAST'
  59. LAST ENDS
  60.  
  61. CODE SEGMENT BYTE PUBLIC 'CODE'
  62. ASSUME CS:CODE,DS:DATA
  63. PUBLIC START
  64. START:    MOV    BX,LAST         ;THE END OF THE PROGRAM
  65.     MOV    AX,ES            ;SUBTRACT FROM THE TOP OF THE HEADER
  66.     SUB    BX,AX            ;BX NOW HAS THE SIZE TO KEEP WHEN WE
  67.                     ; TERMINATE AND STAY RESIDENT
  68.  
  69.     MOV    AX,DATA         ;GET OUR DATA SEGMENT
  70.         MOV     DS,AX
  71.     XOR    AX,AX            ;POINT ES AT SEGMENT ZERO
  72.     MOV    ES,AX            ;
  73.  
  74.     MOV    AX,OFFSET IO_ROUTINE    ;GET A POINTER TO THE I/O ROUTINE
  75.     MOV    ES:[INT_NUM*4],AX    ;POINT THE INTERRUPT TO THE IO ROUTINE
  76.     MOV    AX,CS            ;GET THE CURRENT SEGMENT
  77.     MOV    ES:[INT_NUM*4+2],AX    ;MOVE IT IN
  78.  
  79.     MOV    AH,31H            ;USE THE MSDOS KEEP PROCESS FUNCTION
  80.     MOV    DX,BX            ;GET THE SIZE OF OUR ROUTINES
  81.     INT    21H            ;THATS IT
  82.  
  83. ;---------------------------------------------------------------------------
  84. ;  This routine will be called when ever Soft-ICE reaches a break point
  85. ; and the ACTION is set to our INT_NUM.  The stack will be set up as if
  86. ; a normal REAL mode interrupt had happend. ie;
  87. ;
  88. ;            FLAGS
  89. ;            CS
  90. ;            IP
  91. ;  The opcodes that we will be looking for are:
  92. ;    0ECH - IN  AL,DX
  93. ;    0EDH - IN  AX,DX
  94. ;    0EEH - OUT AL,DX
  95. ;    0EFH - OUT AX,DX
  96. ;   Note that bit 02h tells us whether it is an IN or an OUT and bit 01h tells
  97. ;  us whether it is a BYTE or a WORD.
  98. ;
  99. ;---------------------------------------------------------------------------
  100. IO_ROUTINE PROC FAR
  101.     PUSHA                ;SAVE ALL THE CURRENT REGISTERS
  102.     MOV    BP,SP            ;USE BP TO POINT BACK ONTO THE STACK
  103.     PUSH    DS            ;SAVE THE SEGMENTS ALSO
  104.     PUSH    ES            ;
  105.     MOV    AX,DATA         ;GET OUR DATA SEGMENT
  106.     MOV    DS,AX            ;SET IT UP
  107.     MOV    AX,[BP].REG_CS        ;GET THE OLD CS REGISTER
  108.     MOV    ES,AX            ;SET ES TO THAT SEGMENT
  109.     MOV    SI,[BP].REG_IP        ;USE SI TO POINT TO THE IP
  110.     MOV    AL,ES:[SI-1]        ;GET THE OPCODE OF THE I/O INSTRUCTION
  111.     CMP    AL,0ECH         ;WAS IT IN IT I/O OPCODE RANGE?
  112.     JB    NOT_AN_IO        ;NOPE
  113.     CMP    AL,0EFH         ;CHECK THE HIGH END
  114.     JA    NOT_AN_IO        ;NOPE NOT THIS ONE EITHER
  115.     MOV    DX,[BP].REG_DX        ;GET THE DX REGISTER FROM THE STACK
  116.     MOV    CL,0            ;ASSUME IT WAS A BYTE ACCESS
  117.     TEST    AL,01H            ;WAS IT A BYTE OR A WORD?
  118.     JZ    BYTE_ACCESS        ;YES, JUST A BYTE
  119.     MOV    CL,1            ;MARK IT AS WORD ACCESS
  120. BYTE_ACCESS:
  121.     TEST    AL,02H            ;WAS IT AN IN OR AN OUT
  122.     JNZ    OUT_OPCODE        ;IT WAS AN OUT
  123. IN_OPCODE:
  124. ;---------------------------------------------------------------------------
  125. ;  ENTRY:   CL = BYTE OR WORD ACCESS
  126. ;         0 = BYTE
  127. ;         1 = WORD
  128. ;
  129. ;         DX = THE I/O PORT
  130. ;
  131. ;  EXIT:
  132. ;         [BP].REG_AX OR [BP].REG_AL   SHOULD HAVE THE SIMULATED VALUE
  133. ;
  134. ;---------------------------------------------------------------------------
  135.  
  136.     MOV    BX,NEXT_IN_LOC
  137.     MOV    AX,BUFFIN[BX+2]
  138.     MOV    [BP].REG_AL,AL        ;MOVE IN JUST A BYTE
  139.     ADD    NEXT_IN_LOC,4
  140.     MOV    AX,NEW_VAL        ;GET THE LAST OUTPUT VALUE
  141.     OR    CL,CL            ;IS IT A BYTE OR A WORD
  142.     JZ    DO_BYTE         ;JUST A BYTE
  143.     MOV    [BP].REG_AX,AX        ;MOVE IT IN
  144.     JMP    IO_DONE
  145. DO_BYTE:
  146.     MOV    [BP].REG_AL,AL        ;MOVE IN JUST A BYTE
  147.     JMP    IO_DONE
  148. OUT_OPCODE:
  149. ;---------------------------------------------------------------------------
  150. ;  ENTRY:   CL = BYTE OR WORD ACCESS
  151. ;         0 = BYTE
  152. ;         1 = WORD
  153. ;
  154. ;         DX = THE I/O PORT
  155. ;
  156. ;         [BP].REG_AX OR [BP].REG_AL   THE VALUE GOING OUT
  157. ;
  158. ;---------------------------------------------------------------------------
  159.     MOV    AX,[BP].REG_AX        ;GET THE VALUE
  160.     MOV    NEW_VAL,AX        ;SAVE IT
  161.  
  162.     MOV    BX,NEXT_OUT_LOC
  163.     MOV    BUFFOUT[BX],DX
  164.     MOV    BUFFOUT[BX+2],AX
  165.     ADD    NEXT_OUT_LOC,4
  166.  
  167. IO_DONE:
  168. NOT_AN_IO:
  169.     POP    ES            ;RESTORE ALL OF THE SEGMENTS AND REGS
  170.     POP    DS            ;
  171.     POPA                ;
  172.     IRET                ;RETURN TO THE INSTRUCTION AFTER THE
  173.                     ; I/O
  174. IO_ROUTINE ENDP
  175.  
  176.  
  177. CODE ENDS
  178.  
  179. END START
  180.